package goutils

import (
	"fmt"
	"net"
	"strings"
)

// 判断是否是ipv4地址
func isIPv4(address string) bool {
	return strings.Count(address, ":") < 2
}

// 判断是否是ipv6地址
func isIPv6(address string) bool {
	return strings.Count(address, ":") >= 2
}

// 判断当前网卡名称是否在nets列表中，仅判断首部2个字符是否相等
func inNets(netstr string, nets []string) bool {
	for _, v := range nets {
		if Substr(v, 0, 2) == netstr {
			return true
		}
	}
	return false
}

// 获取本地网卡ip地址列表
func GetIPV4s(nets []string) ([]string, error) {
	ipaddrs := []string{}
	// 获取所有网卡
	inets, err := net.Interfaces()
	if err != nil {
		return nil, err
	}
	// 循环所有网卡
	for _, i := range inets {
		inetName, err := net.InterfaceByName(i.Name)
		if err != nil {
			return nil, err
		}

		// 过滤不在nets中的网卡
		if !inNets(Substr(inetName.Name, 0, 2), nets) {
			continue
		}
		// 获取相应网卡ip地址
		ips, err := inetName.Addrs()
		if err != nil {
			return nil, err
		}
		// 网卡有可能包含多个ip地址
		ipv4s := []string{}
		for _, v := range ips {
			if isIPv4(v.String()) {
				ipv4s = append(ipv4s, v.String())
			}
		}
		ipaddrs = append(ipaddrs, fmt.Sprintf("%s: %v", inetName.Name, ipv4s))
	}
	// 所有网卡格式化字符串
	return ipaddrs, nil
}
